package cn.bearspark.comment.provider.dao.mapper;

import cn.bearspark.comment.provider.dao.co.LayerCommentCO;
import cn.bearspark.framework.redis.starter.buffer.hash.un.RedisHashMapper;
import cn.bearspark.framework.redis.starter.buffer.list.RedisPageListMapper;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Set;

/**
 * 层评论数据的数据映射接口
 *
 * @author f
 */
@Mapper
public interface LayerCommentMapper extends RedisHashMapper<LayerCommentCO>, RedisPageListMapper {

    /**
     * 添加一条层评论的数据
     *
     * @param commentId     评论 id
     * @param userId        评论的用户 id
     * @param repliedUserId 被回复评论的用户 id，可以为 null
     * @param bldgCommentId 所在的楼评论 id
     */
    void insert(long commentId, long userId, Long repliedUserId, long bldgCommentId);

    /**
     * 增加评论的点赞数
     *
     * @param commentId 评论 id
     */
    @Update("UPDATE t_comment_layer SET like_num = like_num + 1 WHERE comment_id = #{commentId}")
    void incrLikeNum(long commentId);

    /**
     * 减少评论的点赞数
     *
     * @param commentId 评论 id
     */
    @Update("UPDATE t_comment_layer SET like_num = like_num - 1 WHERE comment_id = #{commentId}")
    void decrLikeNum(long commentId);

    /**
     * 获取指定层评论所在的楼评论 id
     *
     * @param commentId 指定层评论的 id
     * @return 指定层评论所在的楼评论 id
     */
    @Select("SELECT bldg_comment_id FROM t_comment_layer WHERE comment_id = #{commentId}")
    long getBldgCommentId(long commentId);

    /**
     * 获取指定层评论所在的楼评论 id
     *
     * @param commentId 指定层评论的 id
     * @param userId    查询该评论的用户 id
     * @return 指定层评论所在的楼评论 id
     */
    @Select("SELECT bldg_comment_id FROM t_comment_layer " +
            "WHERE comment_id = #{commentId} AND user_id = #{userId}")
    Long getBldgCommentIdWithUserId(long commentId, long userId);

    /**
     * 删除指定评论
     *
     * @param commentId 指定评论的 id
     */
    @Delete("DELETE FROM t_comment_layer WHERE comment_id = #{commentId}")
    void delete(long commentId);

    /**
     * 删除指定楼评论下所有的层评论
     *
     * @param bldgCommentId 指定的楼评论 id
     * @return 删除的记录数
     */
    @Delete("DELETE FROM t_comment_layer WHERE bldg_comment_id = #{bldgCommentId}")
    long deleteByBldgId(long bldgCommentId);

    @Override
    List<LayerCommentCO> listHotData(Set<Long> idSet);

    @Override
    List<LayerCommentCO> listData(List<Long> idList);

    /**
     * 获取指定楼评论下层评论的 id 集合，按照发布时间顺序排序
     *
     * @param bldgCommentId 指定的楼评论 id
     * @param offset        偏移量
     * @param size          元素数
     * @return 层评论的 id 集合
     */
    @Override
    List<Long> listPageId(long bldgCommentId, int offset, int size);
}
